#include <bits/stdc++.h>
using namespace std;
// https://leetcode.cn/problems/valid-sudoku/
// 判断有效数独
class Solution {
public:
    bool isValidSudoku(vector<vector<char>>& board) {
        for(int i=0;i<board.size();i++)
        {
            unordered_map<char,int> mmap;
            for(int j=0;j<board[i].size();j++)
            {
                char ch=board[i][j];
                if(ch!='.')
                    if(++mmap[ch] > 1)return false;
            }
        }
        for(int i=0;i<board.size();i++)
        {
            unordered_map<char,int> mmap;
            for(int j=0;j<board[i].size();j++)
            {
                char ch=board[j][i];
                if(ch!='.')
                    if(++mmap[ch] > 1)return false;
            }
        }

        for(int block=0;block<9;block++)
        {
            int startrow=(block/3)*3;
            int startcol=(block%3)*3;
            unordered_map<char,int> mmap;//这里不能和前面一样，放在下面内，这里检查的是一个方块不是行
            for(int i=0;i<3;i++)
            {
                for(int j=0;j<3;j++)
                {
                    char ch=board[startrow+i][startcol+j];
                    if(ch!='.')
                        if(++mmap[ch] > 1)return false;
                }
            }
        }
        return true;
    }
};